package com.bryant.demo05.ui.start

import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.GridLayoutManager
import com.bryant.demo05.R
import com.bryant.demo05.base.BaseBindingFragment
import com.bryant.demo05.databinding.FragmentStarListBinding
import com.bryant.demo05.storage.CityData
import com.bryant.demo05.ui.detail.DetailActivity
import com.bryant.demo05.utils.GridSpacingItemDecoration
import com.bryant.demo05.utils.WeatherUtils
import com.chad.library.adapter4.BaseQuickAdapter

class StartFragment : BaseBindingFragment<FragmentStarListBinding>(), StarListView,
    BaseQuickAdapter.OnItemChildClickListener<CityData> {

    // ---------------------------------- 变量定义 -------------------------------
    // Presenter 层的引用，用于与数据层交互
    private var mPresenter: StarListPresenter? = null

    // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    // --------------------------------- OnCreate生命周期 -------------------------------
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 创建 Presenter 实例
//        mPresenter = StarListPresenter(this, StarListInteractor())

    }
    // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

    // -------------------------------------OnResume生命周期 -------------------------------
    //页面恢复时调用的方法，用于刷新收藏城市列表。
    override fun onResume() {
        super.onResume()
        showLoading()
        mPresenter?.getCityList()
    }
    // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

    // --------------------------------- 继承自BaseBindingFragment -------------------------------
    // 该方法的作用是初始化并返回一个视图绑定对象，具体解释如下：
    override fun initBinding(
        inflater: LayoutInflater,
        parent: ViewGroup?
    ): FragmentStarListBinding {
        return FragmentStarListBinding.inflate(inflater, parent, false)
    }

    // 该方法通常在 Fragment 的视图创建完成后被调用，用于执行 UI 相关的初始化操作 - 适配器相关操作
    override fun initView() {
        // 获取上下文并初始化 Presenter
        var context: Context? = getContext()
        context?.let {
            mPresenter = StarListPresenter(this, StarListInteractor())
        }

        // 设置 RecyclerView 的布局管理器为 GridLayoutManager（2列）
        binding.rvStarsList.layoutManager = GridLayoutManager(mActivity, 2)

        // 添加间距装饰器，设置每个 item 之间的间距
        mActivity?.let {
            binding.rvStarsList.addItemDecoration(
                GridSpacingItemDecoration(
                    2,
                    WeatherUtils.dip2px(it, 10f), false
                )
            )
        }

        // 创建适配器实例
        var adapter = StarListAdapter()
        // 为适配器添加子项点击监听器，关联到当前类
        adapter.addOnItemChildClickListener(R.id.iv_city_star, this)

        // 设置条目点击事件，跳转至天气详情页
        adapter.setOnItemClickListener { adapter, view, position ->
            var bean = adapter.getItem(position) as CityData
            var intent = Intent(mActivity, DetailActivity::class.java)
            intent.putExtra("cityName", bean.name)
            intent.putExtra("latitude", bean.latitude.toString())
            intent.putExtra("longitude", bean.longitude.toString())
            startActivity(intent)
        }

        // 将适配器绑定到 RecyclerView
        binding.rvStarsList.adapter = adapter
    }
    // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<


    //  ------------------------------- 继承自StarListView -------------------------------
    override fun getCityListSuccess(cityList: List<CityData>) {
        hideLoading()
        val adapter = binding.rvStarsList.adapter as StarListAdapter
        adapter.submitList(cityList)
    }

    override fun getCityListFailed() {
        hideLoading()
    }

    override fun deleteCitySuccess() {
        /*
        * 使用 Handler(Looper.getMainLooper()).post {} 确保在主线程执行UI更新操作
          这是因为删除操作可能在后台线程完成，需要切换回主线程才能更新UI
        * */
        Handler(Looper.getMainLooper()).post {
            showLoading()
            mPresenter?.getCityList()
        }
    }

    override fun deleteCityFailed() {
        hideLoading()

    }

    override fun onItemClick(adapter: BaseQuickAdapter<CityData, *>, view: View, position: Int) {
        var bean = adapter.getItem(position)
        when (view.id) {
            R.id.iv_city_star -> {
                // 点击收藏图标时删除对应城市的收藏记录
                mPresenter?.deleteCity(bean?.name.toString())
            }
        }
    }
    // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
}